/* eslint-disable no-unused-vars */
import { reqCartList, reqDeleteCarById, reqUpdateCheckedById } from "@/api/index"
const state = {
    cartList: []
};
const mutations = {
    GETCARTLIST(state, cartList) {
        state.cartList = cartList
    }
};
const actions = {
    //获取购物车列表的数据
    async getCartList({ commit }) {
        let result = await reqCartList()
        // console.log(result)
        if (result.code == 200) {
            commit("GETCARTLIST", result.data)
        }
    },
    //删除购物车的某一个产品数据
    async deleteCartListBySkuId({ commit }, skuId) {
        let result = await reqDeleteCarById(skuId)  //没有返回结果，不需要三连环
        // console.log(result)
        if (result.code == 200) {
            return "ok";
        } else {
            return Promise.reject(new Error("faile"))
        }

    },
    //改变购物车的选中状态 当带入两个及以上的参数时，要用对象的形式表示
    async updateCheckedById({ commit }, { skuId, isChecked }) {
        let result = await reqUpdateCheckedById(skuId, isChecked)
        if (result.code == 200) {
            return 'ok'
        } else {
            return Promise.reject(new Error("faile"))
        }
    },
    //删除购物车全部选中的商品,但是后台并没有这个接口，需多次调用deleteCartListBySkuId的接口
    deleteAllCheckedCart({ dispatch, getters, }) {
        //context相当于大仓库，里面有commit[提交mutation修改state]，getters，state,dispatch,意味着在vuex中也可以派发vuex的action函数
        // console.log(context)
        console.log(getters.cartList.cartInfoList)//获取getters里(购物车)的数据
        let PromiseAll = []
        getters.cartList.cartInfoList.forEach(item => { //遍历购物车的数量，并派发相应次数的action
            let promise = item.isChecked == 1 ? dispatch("deleteCartListBySkuId", item.skuId) : ''//promise接收派发action返回的promise对象
            // console.log(111) 执行了item个数的次数
            PromiseAll.push(promise) //往定义的空数组中添加执行结果的promise
        });
        return Promise.all(PromiseAll)//PromiseAll数组中有一个promise是失败，全部都是失败，反之，都成功
    },
    //修改购物车的全部选中，全选与全不选 state与getters一样都是获取数据
    updateAllCartIsChecked({ dispatch, state }, isChecked) {
        // console.log(state) 获取context中的state值
        // console.log(isChecked) 获取上个页面传来的isChecked值
        let PromiseAll = []   //定义一个空数组，用来接收完成函数后返回的promise对象
        state.cartList[0].cartInfoList.forEach(item => {
            let promise = dispatch('updateCheckedById', { skuId: item.skuId, isChecked })//直接派发改变购物车全部选中的函数，直接修改全部
            //promise是派发修改选中状态函数的返回值，一定是个promise对象
            PromiseAll.push(promise);//将返回的promise对象添加到PromisAll数组中
        });
        return Promise.all(PromiseAll)//全部成功返回true，有一个失败，就返回false

    }
};
const getters = {
    //简化一下购物车的数据
    cartList(state) {
        //返回的数据，在服务器没得到数据之前，至少返回一个空对象
        return state.cartList[0] || {}
    }
};
export default {
    state, mutations, actions, getters
}